/**
 * @defgroup TestArrayIO 关于Java数组读写机制的例子
 * @author 李焕帅
 * @version 0.1
 * @date 01/08/2012
 * @{
 */
package indd.lihs.basic.javabasictester.io;

import java.io.*;

/**
 * @name 测试类型定义
 * @{
 */
public class TestArrayIO
{
    /**
     * 主函数
     * @param[in] args 参数字符串数组
     * @return void
     * @note 某个方法可能抛出某种异常,但其中没有定义相应的捕获代码.这时如果抛出,\n
     * 则系统直接退出该方法,并将异常发回给调用者
     */
	public static void main(String[] args) throws IOException, 
	                                    ClassNotFoundException
	{
		int[] arr1 = {1, 2, 3, 4};
		PlanarPoint[] arr2 = {new PlanarPoint(1.5, 2), new PlanarPoint(), 
				new PlanarPoint(1, 2.4)};
		
		//输出
		ObjectOutputStream out = new ObjectOutputStream(
				new BufferedOutputStream(new FileOutputStream("arr.dat")));
		out.writeObject(arr1);
		out.writeObject(arr2);
		out.close();
		
		//输入
		ObjectInputStream in = new ObjectInputStream(
				new BufferedInputStream(new FileInputStream("arr.dat")));
		int[] readArr1 = (int[])(in.readObject());
		PlanarPoint[] readArr2 = (PlanarPoint[])(in.readObject());
		
		//展示
		for(int i : readArr1) //foreach语法
			System.out.print(i + " ");
		System.out.println();
		for(PlanarPoint p : readArr2)
			System.out.print(p + " ");
		System.out.println();
		in.close();
	}
}

/** @}*/ //测试类型定义

/**
 * @name 平面坐标类型
 * @note 实现标记接口Serializable, 启动java序列化机制\n
 *       自动忽略静态成员, 且如果对象可序列化, 对象数组亦可序列化\n
 *       如果不像启动某个成员的序列化,在它之前加transient关键字
 * @{
 */
class PlanarPoint implements Serializable
{
    /** 序列化版本UID */
    private static final long serialVersionUID = 1L;
    /** 横坐标 */
    private double x;
    /**　纵坐标 */
    private double y;
    
    /**
     * 默认构造函数
     * @parm[in] void
     */
    public PlanarPoint()
    {
        x = 0;
        y = 0;
    }
    
    /**
     * 构造函数
     * @parm[in] x 横坐标
     * @parm[in] y 纵坐标
     */
    public PlanarPoint(double x, double y)
    {
        this.x = x;
        this.y = y;
    }
    
    //toString
    public String toString()
    {
        return ("(" + x + "," + y + ")"); //自动构造
    }
}

/** @}*/ //平面坐标类型

/** @}*/ //模块定义
